查看原文
其他

教程|让水滴逃脱地心引力,往上飞

柴火菌 柴火创客空间 2021-07-07


2020年的开局并不轻松,发生了很多不尽人意的事情微博#你希望重启2020吗?#冲上热搜,一条208万点赞的微博投票里,141万人希望可以时光倒流,重启2020。


但是,无论是2020,还是我们的人生,时间如洪流,推着人往前,没有暂停键可按,也没有所谓的时光倒流。我们能做的只有好好努力,珍惜当下,觉得压力大的时候,那就看看这“摆脱“地心引力的小水滴,看它肆无忌惮的往上飞,从中找到继续前行的动力吧!


 

今天给大家分享的项目,来自小小铭Makerming。这个项目的灵感来自于视觉暂留现象,有声电影每秒24格画面,在人脑中即可形成连贯的影像,称之为“视觉暂留现象”,作品通过高速闪动的LED灯光源,照亮不断下滴的水滴,应用人的视错觉,通过调整LED灯的频率和水泵的频率,当两者相互配合达到一个精妙的频率差时,人眼就会产生水滴往上的视错觉。


戳视频领略“反重力”,柴火B站敬请关注


酷不酷?想不想自己也挑战下重力,做出可以往上飞的水滴效果?教程在此,不谢!


教程难度:高手级

项目时长:>2天


软件工具

  • Arduino IDE

设备工具

  • 激光切割机

  • 热熔胶枪

  • 电烙铁

硬件清单

  • Seeeduino Lotus主控 V1.1 X1

  • Grove - MOSFET X2

  • Grove 旋转角度传感器 X2

  • Grove开关(可切换高低电平) X1

  • 蠕动泵X1

  • 水管 X 1M

  • 5050 LED灯条 X 1.2M

  • 12V电源

  • DC母头电源座 X2

  • DC转换线(1母头转2公头) X1

  • 跳线

  • 5mm亚克力板

  • 亚克力胶

扫码一键买齐所有开源硬件物料




步骤1:设计&激光切割外壳

为了方便测试,外壳的背面和顶盖先不要封死,水管和灯带装好后可只留出顶盖,方便随时开放调试。文末点击阅读原文下载项目结构件设计dxf原文件。




步骤2:硬件连接


步骤3:硬件组装




步骤4:编程与程序烧录

#include <PWM.h> // PWM Frequency library available at https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads
const byte SValve = 5; // 水泵 D5const byte LED_strip = 3; // 灯带 D3
const byte Mode = A0; // Switch开关调模式 A0 HIGH为标准模式 LOW为调校模式const byte frequency_sValve_GET = A2; //电位计调水泵频率 A2const byte frequency_led_GET = A6; //电位计调灯带频率 A6
float BASE_FREQ = 48 ; //基准频率float frequency_offset = 0.2; //频率差float duty_sValve = 2; //水泵占空比 float frequency_sValve = BASE_FREQ; // 水泵频率设置为基准频率float duty_led = 7; // 灯带占空比 调亮度float frequency_led = frequency_sValve+frequency_offset; //灯带频率设置为基准频率加频率差
//**********************************************************************************************************************************************************void setup(){ Serial.begin(9600);
//initialize all timers except for 0, to save time keeping functions InitTimersSafe();
//sets the frequency for the specified pin bool success = SetPinFrequencySafe(LED_strip, frequency_led); bool success2 = SetPinFrequencySafe(SValve, frequency_sValve); if(success and success2) Serial.print("init pwm successfully"); }
//**********************************************************************************************************************************************************void loop(){      if (!digitalRead(Mode)) { Serial.print("调试模式已启动");Serial.print("\n");
float duty_led = 7;//7 灯带占空比 调亮度Serial.print("灯带占空比 = ");Serial.print(duty_led);Serial.print("\n");
float frequency_sValve = map(analogRead(frequency_sValve_GET),0,1023,20,60); // 水泵频率设置为基准频率Serial.print("水泵频率 = ");Serial.print(frequency_sValve);Serial.print("\n");
float frequency_led = map(analogRead(frequency_led_GET),0,1023,20,60); //灯带频率设置为基准频率加频率差Serial.print("灯带频率 = ");Serial.print(frequency_led);Serial.print("\n");
Serial.print("灯带水泵频率差 = ");Serial.print(frequency_led-frequency_sValve);Serial.print("\n");Serial.print("\n");
// Open the waterPump with speices frequency and dutySetPinFrequencySafe(SValve, frequency_sValve);sValve_on();
// Open the LED_strip with speices frequency and dutySetPinFrequencySafe(LED_strip, frequency_led); pwmWrite(LED_strip, round(duty_led*255/100));
}else{Serial.print("标准模式已启动");Serial.print("\n"); //float BASE_FREQ = 45;Serial.print("基准频率 = ");Serial.print(BASE_FREQ);Serial.print("\n");
//float frequency_offset = 0.4;Serial.print("频率差 = ");Serial.print(frequency_offset);Serial.print("\n");
float duty_led = 7;//7 灯带占空比 调亮度Serial.print("灯带占空比 = ");Serial.print(duty_led);Serial.print("\n");
float frequency_sValve = BASE_FREQ; // 水泵频率设置为基准频率Serial.print("水泵频率 = ");Serial.print(frequency_sValve);Serial.print("\n");
float frequency_led = frequency_sValve+frequency_offset; //灯带频率设置为基准频率加频率差Serial.print("灯带频率 = ");Serial.print(frequency_led);Serial.print("\n");Serial.print("\n");// Open the waterPump with speices frequency and dutySetPinFrequencySafe(SValve, frequency_sValve);sValve_on();
// Open the LED_strip with speices frequency and dutySetPinFrequencySafe(LED_strip, frequency_led); pwmWrite(LED_strip, round(duty_led*255/100)); }    }  
//**********************************************************************************************************************************************************void sValve_on() { pwmWrite(SValve, 255); }
//**********************************************************************************************************************************************************void sValve_off() { pwmWrite(SValve, 0); }


步骤5:测试

如果追求一个完美的作品,调试是最花时间的步骤,有点耐心,好好调试到你满意的效果,之后就好好享受反重力水滴带来的乐趣吧。




文末点击阅读原文可以前往该教程英文页面






🤖️🤖️🤖️

文末互动话题

上面这个往上飞的水滴,够溜吗?

留言区见





 写在最后-文末小广告 

接下来,柴火将基于开源硬件套件(包含部分上诉项目所用的技术模块)定期开设课程,该课程将涉及(但不限于)以下节点:硬件基础原理;传感器应用;基本结构搭建;软件编程与硬件结合;原型搭建;创客马拉松等。


如果你也想玩转开源硬件,

用科技赋能创新落地,

欢迎扫码填写课程意向报名哟!




----END----

  Chaihuo x.factory|深圳,河北  


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存